package com.glink.manage.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.glink.common.exception.GeneralSimpleException;
import com.glink.manage.domain.ConstructionWorkBean;
import com.glink.manage.dto.constructionwork.*;
import com.glink.manage.vo.constructionwork.ConstructionWorkBaseVO;
import com.glink.manage.vo.constructionwork.ConstructionWorkListVO;
import com.glink.manage.vo.constructionwork.ConstructionWorkPageVO;
import com.glink.manage.vo.participatingunit.ParticipatingUnitSimpleInfoVO;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * @author  qiushaoshan
 * @since  2025-01-08
 */
public interface ConstructionWorkService extends IService<ConstructionWorkBean> {
    
    /**
     * 保存施工工程
     * @param dto 保存信息
     * @return 保存状态
     */
    boolean saveConstructionWork(ConstructionWorkSaveDTO dto);

    /**
     * 更新施工工程
     * @param dto 更新信息
     * @return 更新状态
     */
    boolean updateConstructionWork(ConstructionWorkUpdateDTO dto) throws GeneralSimpleException;

    /**
     * 根据ID查询施工工程信息
     * @param workIdDTO 施工工程ID
     * @return 施工工程信息
     */
    ConstructionWorkBaseVO findById(ConstructionWorkIdDTO workIdDTO) throws GeneralSimpleException;
    
    /**
     * 分页查询施工工程
     * @param dto 分页查询条件
     * @return 施工工程
     */
    IPage<ConstructionWorkPageVO> findByPage(ConstructionWorkPageDTO dto) throws GeneralSimpleException;

    /**
     * 导出
     * @param dto 导出条件
     * @return 导出信息
     * @throws Exception
     */
    void exportExcel(ConstructionWorkExportDTO dto, HttpServletResponse response) throws Exception;

    /**
     * 分页查询参建单位列表
     * @param dto 施工工程信息
     * @return 参建单位
     */
    IPage<ParticipatingUnitSimpleInfoVO> findUnitByPage(ConstructionWorkUnitPageDTO dto);

    /**
     * 餐具工程ID查询工程名称
     * @param constructionWorkObjId 工程ID
     * @return 工程名称
     */
    String findNameByObjId(String constructionWorkObjId);

    /**
     * 根据工程ID查询排出后的工程信息
     * @param constructiuonWorkObjIdList 工程ID
     * @return 工程信息
     */
    List<ConstructionWorkListVO> findPendingAdmissionListByObjIdNotIn(List<String> constructiuonWorkObjIdList) throws GeneralSimpleException;

    /**
     * 根据工程ID查询工程名称
     * @param constructionWorkIdList 工程ID
     * @return 工程名称
     */
    List<String> findNameByObjIdList(List<String> constructionWorkIdList);

    /**
     * 根据用户所属单位查询工程列表
     * @return 工程
     */
    List<ConstructionWorkListVO> findWorkListByOrgId() throws GeneralSimpleException;


    /**
     * 根据所属项目部ID查询施工工程
     * @param orgIdList 所属项目部ID
     * @return 施工工程ID
     */
    List<String> findIdByProjectDepartmentObjIdIn(List<String> orgIdList);

    /**
     * 根据工程ID查询负责人
     * @param constructionWorkObjId 工程ID
     * @return 负责人
     */
    String findSuperintendentByObjId(String constructionWorkObjId);

    /**
     * 查询所有的工程ID
     * @return 工程ID
     */
    List<String> findAllId();

    /**
     * 根据参建单位ID查询关联的工程
     * @param unitIdList 参建单位ID
     * @return 工程ID
     */
    List<String> findWorkIdByUnitId(String unitIdList);

    /**
     * 根据工程查询所属单位
     * @param constructionWorkObjId 工程ID 
     * @return 单位ID
     */
    String findProjectDepartmentObjIdByObjId(String constructionWorkObjId);

    /**
     * 根据所属单位查询工程信息
     * @param projectDepartmentObjId 单位信息
     * @return 工程ID
     */
    List<String> findWorkIdByProjectDepartmentObjId(String projectDepartmentObjId);

    /**
     * 根据单位查询项目信息，并且根据单位的顺序号排序
     * @param headOffice 是否总部管理员
     * @param orgIdList 单位ID
     * @return 工程信息
     */
    List<ConstructionWorkBean> findByIsHeadOfficeAndProjectDepartmentObjIdInOrderByProjectDepartmentOrgOrderAsc(boolean headOffice, List<String> orgIdList);

    /**
     * 根据单位信息查询施工工程ID
     * @param orgIdList 单位信息
     * @return 工程ID
     */
    List<String> findWorkIdByProjectDepartmentObjIdIn(List<String> orgIdList);

    /**
     * 查询项目再建工程列表
     * @return 工程信息
     */
    List<ConstructionWorkListVO> findDepartmentPendingAdmissionList() throws GeneralSimpleException;

    /**
     * 查询参建单位再建工程列表
     * @return 工程信息
     */
    List<ConstructionWorkListVO> findParticipatingUnitPendingAdmissionList() throws GeneralSimpleException;

    /**
     * 根据单位查询监理单位所监理的工程，查询工程下的所有参建单位
     *
     * @param orgId  监理单位ID
     * @param workId
     * @return 所有参见单位
     */
    List<String> findParticipatingUnitObjIdBySupervisorUnit(String orgId, String workId);

    /**
     * 根据参建单位ID查询工程所属的项目部
     * @param unitObjId 参见单位ID
     * @return 项目部ID
     */
    List<String> findObjIdByGeneralContractingUnitObjId(String unitObjId);
    List<String> findObjIdByGeneralContractingUnitObjId() throws GeneralSimpleException;

    /**
     * 移除单位负责热
     * @param personId 人员ID
     */
    void removeUnitResponsiblePersonByPersonId(String personId);

    /**
     * 查询总包管理员准入工程
     * @return 工程ID
     */
    List<String> findGeneralContractingUnitAccessWorkId() throws GeneralSimpleException;
    List<String> findGeneralContractingUnitAccessWorkId(String orgId);


    /**
     * 查询总包单位所管辖的参建单位列表
     * @param constructionWorkIdList 工程
     * @return 参建单位
     */
    List<String> findGeneralContractingUnitParticipatingUnitObjIdByObjIdIn(List<String> constructionWorkIdList);
    
}
